//SD_class.h---------------一个数独类SD_C

#ifndef SD_CLASS_H_
#define SD_CLASS_H_

/*********************
 * 用于存储坐标的结构
 * *******************/


class SD_C
{
	private:
            short s[9][9];                      //9x9个二进制数的二维数组
            int q[9][9] = {0};                	//9x9的二维数组，存储数独答案
            int x;                              //用于定位某个点的x坐标
            int y;                              //同上，y坐标
	
	public:
            static int Count;                   //记录目前生成了几个SD_C类对象，用来记录递归到哪一层

            SD_C() {Count++;}                   //构造函数，每次构造时count 累加1

            ~SD_C() {Count--;}          		//析构函数，每次消除时count 累减1

            /*SD_class_Solve.cpp--------解题类*/

            void SolveAll(int);                	//递归解题方法，可选算法种类
            bool SolveOne();                    //同上，1解

			
            /*SD_class_Alg.cpp----------算法类*/

			bool FindSole(int, int);			//唯一法
			bool FindSoleAble(int, int);		//唯余法
            void AllFind();                     //综合运用唯一法和唯余法刷新数组q和s
            void SmallXY();						//找出候选数最少的位置
			
            /*SD_class_Tool.cpp---------工具类*/

			void Init_q();						//初始化q
            void Init_s();						//初始化操作数组s并打印
            void SimpleInit_s();				//简单初始化s
			void Print_q(int);					//打印数组q
			void Out_q();						//输出q到全局数组q0

            int  CountOneBit(short); 			//计算二进制数中1的个数
            int  HighestOneBit(short);          //取最高位1的位数
            void Print_bit(short);             	//打印九位二进制数

			void Print_s();						//打印当前状态
			int  Check_s();  					//检查解题进度
            void Update_q();					//通过s数组更新答题数组q

            /*SD_class_New.cpp----------生成类*/
            bool NewSD();                       //运用随机数填1\3\5\7\9宫
            void SolveNewSD();                  //生成数独终盘
            void NewUnknowSD();                 //挖空,生成新的数独题目
            bool FindAnswer();                  //递归判断多解
};


 
#endif 
